home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sndhrdw / meadows.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  4KB  |  133 lines

  1. /***************************************************************************
  2.     meadows.c
  3.     Sound handler
  4.     Dead Eye, Gypsy Juggler
  5.  
  6.     J. Buchmueller, June '98
  7. ****************************************************************************/
  8.  
  9. #include "driver.h"
  10. #include "cpu/s2650/s2650.h"
  11.  
  12.  
  13. unsigned char meadows_0c00 = 0;
  14. unsigned char meadows_0c01 = 0;
  15. unsigned char meadows_0c02 = 0;
  16. unsigned char meadows_0c03 = 0;
  17. static unsigned char meadows_dac  = 0;
  18. static int dac_enable;
  19.  
  20. #define BASE_CLOCK        5000000
  21. #define BASE_CTR1       (BASE_CLOCK / 256)
  22. #define BASE_CTR2        (BASE_CLOCK / 32)
  23.  
  24. #define DIV2OR4_CTR2    0x01
  25. #define ENABLE_CTR2     0x02
  26. #define ENABLE_DAC      0x04
  27. #define ENABLE_CTR1     0x08
  28.  
  29. static    int channel;
  30. static    int freq1 = 1000;
  31. static    int freq2 = 1000;
  32. static    signed char waveform[2] = { -120, 120 };
  33.  
  34. /************************************/
  35. /* Sound handler start                */
  36. /************************************/
  37. int meadows_sh_start(const struct MachineSound *msound)
  38. {
  39.     int vol[2];
  40.  
  41.     vol[0]=vol[1]=255;
  42.     channel = mixer_allocate_channels(2,vol);
  43.     mixer_set_volume(channel,0);
  44.     mixer_play_sample(channel,waveform,sizeof(waveform),freq1,1);
  45.     mixer_set_volume(channel+1,0);
  46.     mixer_play_sample(channel+1,waveform,sizeof(waveform),freq2,1);
  47.     return 0;
  48. }
  49.  
  50. /************************************/
  51. /* Sound handler stop                */
  52. /************************************/
  53. void meadows_sh_stop(void)
  54. {
  55.     mixer_stop_sample(channel);
  56.     mixer_stop_sample(channel+1);
  57. }
  58.  
  59. /************************************/
  60. /* Sound handler update             */
  61. /************************************/
  62. void meadows_sh_update(void)
  63. {
  64. static  unsigned char latched_0c01 = 0;
  65. static    unsigned char latched_0c02 = 0;
  66. static    unsigned char latched_0c03 = 0;
  67. int preset, amp;
  68.  
  69.     if (latched_0c01 != meadows_0c01 || latched_0c03 != meadows_0c03)
  70.     {
  71.         /* amplitude is a combination of the upper 4 bits of 0c01 */
  72.         /* and bit 4 merged from S2650's flag output */
  73.         amp = ((meadows_0c03 & ENABLE_CTR1) == 0) ? 0 : (meadows_0c01 & 0xf0) >> 1;
  74.         if( s2650_get_flag() )
  75.             amp += 0x80;
  76.         /* calculate frequency for counter #1 */
  77.         /* bit 0..3 of 0c01 are ctr preset */
  78.         preset = (meadows_0c01 & 15) ^ 15;
  79.         if (preset)
  80.             freq1 = BASE_CTR1 / (preset + 1);
  81.         else amp = 0;
  82.         logerror("meadows ctr1 channel #%d preset:%3d freq:%5d amp:%d\n", channel, preset, freq1, amp);
  83.         mixer_set_sample_frequency(channel, freq1 * sizeof(waveform));
  84.         mixer_set_volume(channel,amp*100/255);
  85.     }
  86.  
  87.     if (latched_0c02 != meadows_0c02 || latched_0c03 != meadows_0c03)
  88.     {
  89.         /* calculate frequency for counter #2 */
  90.         /* 0c02 is ctr preset, 0c03 bit 0 enables division by 2 */
  91.         amp = ((meadows_0c03 & ENABLE_CTR2) != 0) ? 0xa0 : 0;
  92.         preset = meadows_0c02 ^ 0xff;
  93.         if (preset)
  94.         {
  95.             freq2 = BASE_CTR2 / (preset + 1) / 2;
  96.             if ((meadows_0c03 & DIV2OR4_CTR2) == 0)
  97.                 freq2 >>= 1;
  98.         }
  99.         else amp = 0;
  100.         logerror("meadows ctr2 channel #%d preset:%3d freq:%5d amp:%d\n", channel+1, preset, freq2, amp);
  101.         mixer_set_sample_frequency(channel+1, freq2 * sizeof(waveform));
  102.         mixer_set_volume(channel+1,amp*100/255);
  103.     }
  104.  
  105.     if (latched_0c03 != meadows_0c03)
  106.     {
  107.         dac_enable = meadows_0c03 & ENABLE_DAC;
  108.  
  109.         if (dac_enable)
  110.             DAC_data_w(0, meadows_dac);
  111.         else
  112.             DAC_data_w(0, 0);
  113.     }
  114.  
  115.     latched_0c01 = meadows_0c01;
  116.     latched_0c02 = meadows_0c02;
  117.     latched_0c03 = meadows_0c03;
  118. }
  119.  
  120. /************************************/
  121. /* Write DAC value                    */
  122. /************************************/
  123. void meadows_sh_dac_w(int data)
  124. {
  125.     meadows_dac = data;
  126.     if (dac_enable)
  127.         DAC_data_w(0, meadows_dac);
  128.     else
  129.         DAC_data_w(0, 0);
  130. }
  131.  
  132.  
  133.